package com.example.mobilesafe.dao;

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;

import com.example.mobilesafe.db.BlackNumberOpenHelper;
import com.example.mobilesafe.domain.BlackNumberInfo;

import java.util.ArrayList;
import java.util.List;

public class BlackNumberDao {

    // 0.声明SQLite工具类
    private final BlackNumberOpenHelper mBlackNumberOpenHelper;

    /**
     * 让BlackNumberDao实现单例模式（懒汉）
     * 1.私有化构造方法
     * 2.声明一个当前类的对象
     * 3.提供获取单例方法，如果当前类的对象为空，创建一个新的
      */

    /**
     * 1.私有化构造方法
     * @param context 上下文环境
     */
    private BlackNumberDao(Context context) {
        // 创建数据库及其表结构
        mBlackNumberOpenHelper = new BlackNumberOpenHelper(context, "blacknumber.db", null, 1);
    }

    // 2.声明一个当前类对象
    private static BlackNumberDao blackNumberDao;

    /**
     * 3.提供获取单例方法
     * @param context 上下文环境
     * @return
     */
    public static BlackNumberDao getInstance(Context context){
        if (blackNumberDao == null){
            blackNumberDao = new BlackNumberDao(context);
        }
        return blackNumberDao;
    }

    /**
     * 4.增加一个条目
     * @param phone 拦截的电话号码
     * @param mode 拦截类型（1：短信，2：电话，3：短信 + 电话）
     */
    public void insert(String phone,String mode){
        // 1.开启数据库，准备进行写入操作
        SQLiteDatabase db = mBlackNumberOpenHelper.getWritableDatabase();
        // 2.构建数据集
        ContentValues values = new ContentValues();
        values.put("phone",phone);
        values.put("mode",mode);
        // 3.插入数据
        db.insert("blacknumber",null,values);
        // 4.关闭数据流
        db.close();
    }

    /**
     * 5.删除一个条目
     * @param phone 待删除的条目对应的电话号码
     */
    public void delete(String phone){
        // 1.开启数据库，准备进行写入操作
        SQLiteDatabase db = mBlackNumberOpenHelper.getWritableDatabase();
        // 2.删除数据
        db.delete("blacknumber","phone = ?",new String[]{phone});
        // 3.关闭数据流
        db.close();
    }

    /**
     * 6.修改一个条目
     * @param phone 待修改的条目对应的点好号码
     * @param mode 将要修改的拦截类型（1：短信，2：电话，3：短信 + 电话）
     */
    public void update(String phone,String mode){
        // 1.开启数据库，准备进行写入操作
        SQLiteDatabase db = mBlackNumberOpenHelper.getWritableDatabase();
        // 2.构建数据集
        ContentValues values = new ContentValues();
        values.put("mode",mode);
        // 3.修改数据
        db.update("blacknumber",values,"phone = ?",new String[]{phone});
        // 4.关闭数据流
        db.close();
    }

    /**
     * 7.查询全部条目
     * @return 从数据库中查询到的所有的号码以及拦截类型所在的集合
     */
    public List<BlackNumberInfo> queryAll(){
        // 1.开启数据库，准备进行写入操作
        SQLiteDatabase db = mBlackNumberOpenHelper.getWritableDatabase();
        // 2.查询数据
        Cursor cursor = db.query("blacknumber", new String[]{"phone", "mode"}, null, null, null, null, "_id desc");
        // 3.构建Java Bean集合，存储所有查询到的信息
        ArrayList<BlackNumberInfo> blackNumberList = new ArrayList<>();
        // 4.循环读取全部数据
        while (cursor.moveToNext()){
            BlackNumberInfo blackNumberInfo = new BlackNumberInfo();
            blackNumberInfo.setPhone(cursor.getString(0));
            blackNumberInfo.setMode(cursor.getString(1));
            blackNumberList.add(blackNumberInfo);
        }
        // 5.关闭游标和数据流
        cursor.close();
        db.close();
        // 6.返回数据集合
        return blackNumberList;
    }

    /**
     * 8.分页查询数据
     * @param index 索引值
     * @param page 页数
     * @return 从数据库中查询到的所有的号码以及拦截类型所在的集合
     */
    public List<BlackNumberInfo> queryLimit(int index,int page){
        // 1.开启数据库，准备进行写入操作
        SQLiteDatabase db = mBlackNumberOpenHelper.getWritableDatabase();
        // 2.查询数据
        Cursor cursor = db.rawQuery("select * from blacknumber order by _id desc limit ?,?;",new String[]{index + "",page + ""});
        // 3.构建Java Bean集合，存储所有查询到的信息
        ArrayList<BlackNumberInfo> blackNumberList = new ArrayList<>();
        // 4.循环读取全部数据
        while (cursor.moveToNext()){
            BlackNumberInfo blackNumberInfo = new BlackNumberInfo();
            blackNumberInfo.setPhone(cursor.getString(1));
            blackNumberInfo.setMode(cursor.getString(2));
            blackNumberList.add(blackNumberInfo);
        }
        // 5.关闭游标和数据流
        cursor.close();
        db.close();
        // 6.返回数据集合
        return blackNumberList;
    }

    /**
     * 9.获取数据表中的数据条数
     * @return 数据表中的数据总条数
     */
    public int getCount(){
        // 0.初始化数据条数
        int count = 0;
        // 1.开启数据库，准备进行写入操作
        SQLiteDatabase db = mBlackNumberOpenHelper.getWritableDatabase();
        // 2.查询数据
        Cursor cursor = db.rawQuery("select count(*) from blacknumber",null);
        // 3.循环读取全部数据
        if (cursor.moveToNext()){
            count = cursor.getInt(0);
        }
        // 4.关闭游标和数据流
        cursor.close();
        db.close();
        // 5.返回数据集合
        return count;
    }

    /**
     * 10.根据电话号码获取拦截类型
     * @param phone 电话号码
     * @return 返回的拦截模式
     */
    public int queryModeByPhone(String phone){
        // 0.初始化拦截类型
        int mode = 0;
        // 1.开启数据库，准备进行写入操作
        SQLiteDatabase db = mBlackNumberOpenHelper.getWritableDatabase();
        // 2.查询数据
        Cursor cursor = db.query("blacknumber",new String[]{"mode"},"phone = ?",new String[]{phone},null,null,null);
        // 3.循环读取全部数据
        if (cursor.moveToNext()){
            mode = cursor.getInt(0);
        }
        // 4.关闭游标和数据流
        cursor.close();
        db.close();
        // 5.返回拦截模式
        return mode;
    }
}